﻿using ExcellentProjectPlus.Dominio.Calificaciones.Servicios.Parciales;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Calificaciones.Parciales
{
    public class ServicioDeGestionDeParciales : IServicioDeGestionDeParciales
    {
        #region Propiedades
        IServicioDeAdministracionDeParciales _servicioDeAdministracionDeParciales;
        #endregion

        #region Constructores
        public ServicioDeGestionDeParciales(IServicioDeAdministracionDeParciales servicioDeAdministracionDeParciales)
        {
            _servicioDeAdministracionDeParciales = servicioDeAdministracionDeParciales;
        }
        #endregion

        public IEnumerable<Parcial> ObtenerParciales()
        {
            IEnumerable<Parcial> resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeParciales.ObtenerParciales();
                transaccion.Complete();
            }

            return resultado;
        }

        public Parcial ObtenerParcialPorId(int id)
        {
            Parcial resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeParciales.ObtenerParcialPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarParcial(Parcial parcial)
        {
            _servicioDeAdministracionDeParciales.AgregarParcial(parcial);
        }
        public void ModificarParcial(Parcial parcial)
        {
            _servicioDeAdministracionDeParciales.ModificarParcial(parcial);
        }
        public void EliminarParcial(Parcial parcial)
        {
            _servicioDeAdministracionDeParciales.EliminarParcial(parcial);
        }

        public IEnumerable<Parcial> ObtenerParcialesPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDeParciales.ObtenerParcialesPaginado(pagina, tamanio);
        }


        public IEnumerable<Parcial> ObtenerParcialesPorIdDePeriodo(int idDePeriodo)
        {
            IEnumerable<Parcial> resultado = null;
            var trxOptions = new TransactionOptions();
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeParciales.ObtenerParcialesPorIdDePeriodo(idDePeriodo);
                transaccion.Complete();
            }

            return resultado;
        }
    }
}
